//package com.easyforeign.bak;
//
//import com.fasterxml.jackson.core.JsonGenerator;
//import com.fasterxml.jackson.databind.SerializerProvider;
//import lombok.Data;
//import lombok.SneakyThrows;
//
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.ResultSetMetaData;
//import java.sql.SQLException;
//import java.util.*;
//import java.util.stream.Collectors;
//
//@Data
//public class BakMethod {
//
//
//        public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception {
//            // todo 如果后续有办法再序列化收集到所有外键相关的信息，可以在这个方法中，进行批量查询，也就是每个相同的表和外键字段只用查一次
//                // 处理缓存数据 方便一次查询
//                Map<String, List<OneToOneForeignValue>> foreignValueMap = distinctAndMergeForeignValue();
//                for (Map.Entry<String, List<OneToOneForeignValue>> entry : foreignValueMap.entrySet()) {
//                        // 批量查询数据库
//                        selectTargetColumnsInDatabase();
//                }
////                // 先序列化原字段
////                baseWriter.serializeAsField(bean, gen, prov);
////                // 取得加上注解的字段值（外建值）
////                Object selfColumnValue = baseWriter.get(bean);
////                if (selfColumnValue == null) return;
////                // 取得缓存
////                ConcurrentHashMap<String, Optional<String>> cacheMap = getCacheMap(selfColumnValue);
////                // 添加目标字段
////                for (ForeignColumn col : targetColumn) {
////                        String value = Optional.ofNullable(cacheMap.get(col.column()))
////                                .flatMap(v -> v)
////                                .orElse(null);
////                        String columnName = col.alias().isEmpty() ? underlineToCamel(col.column()) : col.alias();
////                        writeField(gen, columnName, value);
////                }
//        }
//
//        private static Map<String, List<OneToOneForeignValue>> distinctAndMergeForeignValue() {
//                List<OneToOneForeignValue> oneToOneForeignValueList = EasyForeignCache.oneToOneForeignValueList;
//                // 先按 key 聚合所有 selectColumns
//                Map<String, Set<String>> keyColumnsMap = new HashMap<>();
//                for (OneToOneForeignValue v : oneToOneForeignValueList) {
//                        keyColumnsMap.computeIfAbsent(v.getTableNameAndForeignColumn(), k -> new HashSet<>());
//                        if (v.getColumns() != null) {
//                                keyColumnsMap.get(v.getTableNameAndForeignColumn()).addAll(v.getColumns());
//                        }
//                }
//
//                // 再遍历原集合，把 selectColumns 替换为聚合后的并集
//                for (OneToOneForeignValue v : oneToOneForeignValueList) {
//                        Set<String> mergedColumns = keyColumnsMap.get(v.getTableNameAndForeignColumn());
//                        v.setColumns(new ArrayList<>(mergedColumns));
//                }
//                Map<String, List<OneToOneForeignValue>> oneToOneForeignValueMap = oneToOneForeignValueList.stream()
//                        .collect(Collectors.groupingBy(OneToOneForeignValue::getTableNameAndForeignColumn));
//
//
//                return oneToOneForeignValueMap;
//        }
//
//
//        @SneakyThrows
//    public static Map<String, String> selectTargetColumnsInDatabase(
//            List<Object> foreignColumnValue,
//            String joinColumn,
//            String[] targetColumn,
//            String tableName,
//            DataSource dataSource) {
//
//        Map<String, String> resultMap = new HashMap<>();
//        String targetColumns = String.join(",", targetColumn);
//        String querySql = "SELECT " + targetColumns + " FROM " + tableName + " WHERE " + selfColumn + " = ?";
//
//        int rowCount = 0;
//
//        try (Connection connection = dataSource.getConnection();
//             PreparedStatement stmt = connection.prepareStatement(querySql)) {
//
//            stmt.setObject(1, selfColumnValue);
//            try (ResultSet rs = stmt.executeQuery()) {
//                ResultSetMetaData metaData = rs.getMetaData();
//                int columnCount = metaData.getColumnCount();
//
//                while (rs.next()) {
//                    rowCount++;
//
//                    // 只取第一条结果
//                    if (rowCount == 1) {
//                        for (int i = 1; i <= columnCount; i++) {
//                            String columnName = metaData.getColumnName(i);
//                            Object columnValue = rs.getObject(i);
//                            if (Arrays.asList(targetColumn).contains(columnName)) {
//                                resultMap.put(columnName, columnValue == null ? null : columnValue.toString());
//                            }
//                        }
//                    }
//                }
//            }
//
//            // 若返回多条，打印警告日志
//            if (rowCount > 1) {
//                log.warn("[EasyForeign] 表：{} 中字段 {}值为 {},查询到 {} 条记录。理论应唯一，已默认取第一条，请检查数据唯一性。",
//                        tableName, selfColumn, selfColumnValue, rowCount);
//            }
//
//        } catch (SQLException e) {
//            log.error("[EasyForeign] 查询外键映射异常，表: {}, 字段: {}, 值: {}, 错误: {}",
//                    tableName, selfColumn, selfColumnValue, e.getMessage(), e);
//        }
//
//        return resultMap;
//    }
//}